#include "sum.h"
#include <crypt.h>
#define STR_LEN 8
 void printCMDType(CMD cmd) {
    switch(cmd) {
        case CMD_TYPE_REGIT1_OK:
            printf("Command Type: CMD_TYPE_REGIT1_OK\n");
            break;
        case CMD_TYPE_REGIT1_ERROR:
            printf("Command Type: CMD_TYPE_REGIT1_ERROR\n");
        default:
            printf("Command Type: UNKNOWN\n");
            break;
    }
}
//生成随机种子
char*GenerateStr(){
    char* str = (char*)malloc(STR_LEN + 1);  // +1 为了存储终止符 '\0'
    int i,flag;
    srand(time(NULL));
    for(i=0;i<STR_LEN;i++){
        flag = rand()%3;
        switch(flag){
        case 0:str[i]=rand()%26+'a';
               break;
        case 1:str[i]=rand()%26+'A';
               break;
        case 2:str[i]=rand()%10+'0';
               break;
        }
    }
    return str;
}

// 客户端注册函数
int server_regite1(cmd_tast* t,MYSQL *p_mysql) {
    // 查询用户名是否存在
    int err = mysql_check_username(p_mysql,(const char*) t->content);
    if (err==1) {
        // 用户名存在，设置为注册错误类型
        t->cmdType = CMD_TYPE_REGIT1_ERROR;
        printf("用户输入了一个存在的用户名\n");
        return 0;
    } 
    else {
      
        // 用户名不存在，设置为注册成功类型并生成盐值
        printf("用户'%s'正在输入注册的密码\n",t->content);
        t->cmdType = CMD_TYPE_REGIT1_OK;
        err=send(t->peerfd, (char*)t, sizeof(*t),0);
        if(err==-1){
            error(0,errno,"send name error");
        }

        //生成盐值
       const char* prefix = "$y$";
       char * salt = crypt_gensalt(prefix,5,NULL,0);


        // 生成盐值
       // char* salt = GenerateStr();
       // if (salt == NULL) {
        //    fprintf(stderr, "GenerateStr failed: %s\n", strerror(errno));
        //    return 0;
       // }
 //       char* salt = GenerateStr();
   //     if (salt == NULL) {
     ///       fprintf(stderr, "GenerateStr failed: %s\n", strerror(errno));
        //    return 0;
      //  }
        char cryp[64]={"喵"};
        // 访问数据库存储用户名和盐值,和路径
        user_data inputData;  
        memset(&inputData, 0, sizeof(inputData)); // 初始化结构体
         // 填充结构体字段
         inputData.username=t->content;
         inputData.salt=salt;
         inputData.cryptpasswd=cryp;
         inputData.pwd=t->path; 
         // 调用数据库写入函数
         mysql_write_user_data1(p_mysql, inputData);  // 确保函数名和参数正确
        

        // 填充盐值到 path 字段用来传递盐值
         memset(&t->path,0,sizeof(t->path));
         strncpy(t->path, salt, sizeof(t->path) - 1);
        // free(salt); // 释放盐值内存
      }
    return 0;
}


int server_regite2(cmd_tast* t,MYSQL *p_mysql){
    if(t->cmdType==CMD_TYPE_REGIT2){
     //接收用户发过来的密文connect字段，并且存入数据库
     //连接数据库
      user_data inputData;
      inputData.cryptpasswd=t->path; //用户的加密密码
      inputData.username=t->content; //用户名    
      mysql_write_user_data2(p_mysql, inputData);

      //改成注册成功状态
      t->cmdType = CMD_TYPE_REGIT_OKK;
      printf("用户'%s'注册成功\n",t->content);
     }
    

    //初始化虚拟文件表
     file_data initialize_file;
     //得到用户id
     char buf[128]={0};
     mysql_get_user_id(p_mysql, buf, t->content);
    
     printf("buf:%s\n",buf);
     
     initialize_file.parent_id="0";//上级目录的id，0表示无父目录
     initialize_file.filename=t->content; //根目录名字和用户名一样
     initialize_file.owner_id = buf;//buf;//用户id    
    
     printf("initialize_file.owner_id:%s\n",initialize_file.owner_id);
     initialize_file.hash = "";//设置为零,可以为null，不插入就行了
     initialize_file.filesize="0";//文件大小
     initialize_file.type="0";//文件类型，目录为0，普通文件为1
     initialize_file.file_path=t->content;//当前目录
     
     mysql_write_file_data(p_mysql,initialize_file);
     printf("2---------------------------------------\n");

      return 0;
}
